經過上一篇的介紹,我們應該知道鏈結串列的單位是節點吧!
節點又會因為「單向鏈結串列」與「雙向鏈結串列」的差異,而有些微不同。
節點的內容其實不只一個,所以我們會更加偏向將們封裝成一個物件。
在 C++ 中,封裝成物件大致分成兩種形式:結構 struct
、類別 class
。
在這裡,我們都以「類別」來實作!
Singly Linked List 上的 Node 簡稱 SLLNode
class SLLNode {
int data; // 資料內容
SLLNode *next; // 鏈結
};
Doubly Linked List 上的 Node 簡稱 DLLNode
class DLLNode {
int data; // 資料內容
DLLNode *next, *prev; // 鏈結
};
為什麼鏈結的表示要用「節點型態的指標」?
因為當我們要取得下一個節點的資料內容之前,我們必須先取得下一個節點的記憶體位址,而「位址」是存在指標中,因此我們以指標來實作鏈結。
「單向鏈結串列」中最重要的是紀錄第一個節點的指標 head
。
透過 head
,我們可以到達任何鏈結串列上的節點。
「雙向鏈結串列」中最重要的是紀錄第一個節點的指標 head
、最後一個節點的指標 tail
。
透過 head
, tail
,我們可以到達任何鏈結串列上的節點。
在未來,我們會為鏈結串列加上更多的函式,如:新增節點、刪除節點、翻轉鏈結串列等,所以我們會將鏈結串列相關的變數、函式包裝成「類別的屬性、方法」。
class SLL {
private:
SLLNode *head;
public:
SLL() {
this -> head = NULL;
}
// methods
};
class DLL {
private:
DLLNode *head, *tail;
public:
DLL() {
this -> head = NULL;
this -> tail = NULL;
}
// methods
};
為什麼要將 head
, tail
設為私有屬性?
因為剛剛提到這兩個變數代表著整個鏈結串列,我們不會希望大家都可以更改他們。
唯一會有機會改變這兩個變數的只有類別方法們,但是他們同屬這個類別,因此私有變數仍可以被他們觸及。
把鏈結串列的模板建立完成後,下一篇就開始新增一些方法到鏈結串列類別中吧!